home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / convers / convers.c next >
Encoding:
C/C++ Source or Header  |  1991-10-29  |  3.7 KB  |  155 lines

  1. static char  rcsid[] = "@(#) $Header: convers.c,v 1.7 89/05/03 20:14:27 dk5sg Exp $";
  2.  
  3. #include <sys/types.h>
  4.  
  5. #include <signal.h>
  6. #include <stdio.h>
  7. #include <sys/socket.h>
  8. #include <termio.h>
  9. #include <time.h>
  10.  
  11. extern char  *getenv();
  12. extern char  *optarg;
  13. extern int  optind;
  14. extern struct sockaddr *build_sockaddr();
  15. extern void exit();
  16. extern void perror();
  17.  
  18. static struct termio prev_termio;
  19.  
  20. /*---------------------------------------------------------------------------*/
  21.  
  22. static void sigpipe_handler(sig, code, scp)
  23. int  sig, code;
  24. struct sigcontext *scp;
  25. {
  26.   scp->sc_syscall_action = SIG_RETURN;
  27. }
  28.  
  29. /*---------------------------------------------------------------------------*/
  30.  
  31. static void stop(arg)
  32. char  *arg;
  33. {
  34.   if (arg) perror(arg);
  35.   ioctl(0, TCSETA, &prev_termio);
  36.   exit(0);
  37. }
  38.  
  39. /*---------------------------------------------------------------------------*/
  40.  
  41. main(argc, argv)
  42. int  argc;
  43. char  **argv;
  44. {
  45.  
  46.   char  *server = "unix:/tcp/sockets/convers";
  47.   char  buffer[2048];
  48.   char  c;
  49.   char  inbuf[2048];
  50.   char  outbuf[2048];
  51.   int  addrlen;
  52.   int  ch;
  53.   int  channel = 0;
  54.   int  echo;
  55.   int  errflag = 0;
  56.   int  i;
  57.   int  incnt = 0;
  58.   int  mask;
  59.   int  outcnt = 0;
  60.   int  size;
  61.   struct sigvec vec;
  62.   struct sockaddr *addr;
  63.   struct termio curr_termio;
  64.  
  65.   vec.sv_mask = vec.sv_flags = 0;
  66.   vec.sv_handler = sigpipe_handler;
  67.   sigvector(SIGPIPE, &vec, (struct sigvec *) 0);
  68.  
  69.   if (ioctl(0, TCGETA, &prev_termio)) stop(*argv);
  70.   if (ioctl(0, TCGETA, &curr_termio)) stop(*argv);
  71.   echo = curr_termio.c_lflag & ECHO;
  72.   curr_termio.c_lflag = 0;
  73.   curr_termio.c_cc[VMIN] = 1;
  74.   curr_termio.c_cc[VTIME] = 0;
  75.   if (ioctl(0, TCSETA, &curr_termio)) stop(*argv);
  76.  
  77.   while ((ch = getopt(argc, argv, "c:s:")) != EOF)
  78.     switch (ch) {
  79.     case 'c':
  80.       channel = atoi(optarg);
  81.       break;
  82.     case 's':
  83.       server = optarg;
  84.       break;
  85.     case '?':
  86.       errflag = 1;
  87.       break;
  88.     }
  89.  
  90.   if (errflag || optind < argc || !(addr = build_sockaddr(server, &addrlen))) {
  91.     fprintf(stderr, "usage: convers [-c channel] [-s host:service]\n");
  92.     stop(0);
  93.   }
  94.  
  95.   close(3);
  96.   if (socket(addr->sa_family, SOCK_STREAM, 0) != 3) stop(*argv);
  97.   if (connect(3, addr, addrlen)) stop(*argv);
  98.  
  99.   sprintf(inbuf, "/NAME %s %d\n", getenv("LOGNAME"), channel);
  100.   if (write(3, inbuf, (unsigned) strlen(inbuf)) < 0) stop(*argv);
  101.  
  102.   for (; ; ) {
  103.     mask = 011;
  104.     select(4, &mask, 0, 0, (struct timeval *) 0);
  105.     if (mask & 1) {
  106.       do {
  107.     if ((size = read(0, buffer, sizeof(buffer))) <= 0) stop(0);
  108.     for (i = 0; i < size; i++) {
  109.       c = buffer[i];
  110.       if (c == '\r') c = '\n';
  111.       if (c == prev_termio.c_cc[VERASE]) {
  112.         if (incnt) {
  113.           incnt--;
  114.           if (echo && write(1, "\b \b", 3) < 0) stop(*argv);
  115.         }
  116.       } else if (c == prev_termio.c_cc[VKILL]) {
  117.         for (; incnt; incnt--)
  118.           if (echo && write(1, "\b \b", 3) < 0) stop(*argv);
  119.       } else if (echo && c == 18) {
  120.         if (write(1, "^R\n", 3) < 0) stop(*argv);
  121.         if (write(1, inbuf, (unsigned) incnt) < 0) stop(*argv);
  122.       } else {
  123.         inbuf[incnt++] = c;
  124.         if (echo && write(1, &c, 1) < 0) stop(*argv);
  125.       }
  126.       if (c == '\n' || incnt == sizeof(inbuf) - 1) {
  127.         if (*inbuf == '!') {
  128.           inbuf[incnt] = '\0';
  129.           if (ioctl(0, TCSETA, &prev_termio)) stop(*argv);
  130.           system(inbuf + 1);
  131.           if (ioctl(0, TCSETA, &curr_termio)) stop(*argv);
  132.           if (write(1, "!\n", 2) < 0) stop(*argv);
  133.         } else {
  134.           if (write(3, inbuf, (unsigned) incnt) < 0) stop(*argv);
  135.         }
  136.         incnt = 0;
  137.       }
  138.     }
  139.       } while (incnt);
  140.     } else {
  141.       size = read(3, buffer, sizeof(buffer));
  142.       if (size <= 0) stop(0);
  143.       for (i = 0; i < size; i++) {
  144.     c = buffer[i];
  145.     if (c != '\r') outbuf[outcnt++] = c;
  146.     if (c == '\n' || outcnt == sizeof(outbuf)) {
  147.       if (write(1, outbuf, (unsigned) outcnt) < 0) stop(*argv);
  148.       outcnt = 0;
  149.     }
  150.       }
  151.     }
  152.   }
  153. }
  154.  
  155.